<?php

class Framework
{
    // 启动框架
    public static function run()
    {
        self::initConst();
        self::initConfig();
        self::initRoute();
        self::initAutoLoad();
        self::initDispatch();
    }

    /**
     * 定义路径常量
     */
    private static function initConst()
    {
        define('DS', DIRECTORY_SEPARATOR);  // 目录分隔符
        define('ROOT_PATH', getcwd().DS);   // 入口文件所在的目录
        define('APP_PATH', ROOT_PATH.'..'.DS.'app'.DS); // app目录
        define('CONFIG_PATH', APP_PATH.'config'.DS);    // config目录
        define('CONTROLLER_PATH', APP_PATH.'controller'.DS);    // controller目录
        define('MODEL_PATH', APP_PATH.'model'.DS);  // model目录
        define('VIEW_PATH', APP_PATH.'view'.DS);    // view目录
        define('FRAMEWORK_PATH', ROOT_PATH.'..'.DS.'framework'.DS); // framework目录

    }

    /**
     * 引入配置文件
     */
    private static function initConfig()
    {
        $GLOBALS['config'] = require CONFIG_PATH.'config.php';
    }

    /**
     * 确定路由
     */
    private static function initRoute()
    {
        $controller = $_GET['c'] ?? $GLOBALS['config']['app']['defaultController'];
        $action = $_GET['a'] ?? $GLOBALS['config']['app']['defaultAction'];
        $controller = ucfirst(strtolower($controller)); // 首字母大写
        $action = strtolower($action);  // 小写
        define('CONTROLLER_NAME', $controller); // 控制器名常量
        define('ACTION_NAME', $action); // 动作名常量
    }

    /**
     * 自动加载类
     */
    private static function initAutoLoad()
    {
        spl_autoload_register(function ($className) {
            $className = str_replace('\\', DS, $className);
            $namespace = dirname($className);  // 命名空间
            $className = basename($className);    // 类名
            if (in_array($namespace, ['core'])) {
                $path = FRAMEWORK_PATH.$namespace.DS.$className.'.php';
            } elseif ($namespace == 'model') { // 模型类
                $path = MODEL_PATH.$className.'.php';
            } else {    // 控制器类
                $path = CONTROLLER_PATH.$className.'.php';
            }
            if (file_exists($path) && is_file($path)) {
                require $path;
            }
        });
    }

    /**
     * 请求分发
     */
    private static function initDispatch()
    {
        $controllerName = '\controller\\'.CONTROLLER_NAME.'Controller'; // 拼接控制器类名
        $actionName = ACTION_NAME.'Action'; // 拼接方法名
        $obj = new $controllerName();
        $obj->$actionName();
    }
}